baberu: 課金機能を作る
モチベーション
課金の実装をしてみたい
要件
1ユーザー2週間使用期間を設ける
それ以上使う場合には買い切り1000円
しくみ
code:mermaid
sequenceDiagram
actor User
participant BOOTH
participant Developer
participant Firestore
participant ChromeExt as Chrome拡張
participant CloudFunction
User->>BOOTH: 製品購入
BOOTH-->>Developer: 購入通知
Developer->>Developer: UUIDベースのライセンスキー生成
Developer->>Firestore: ライセンス情報登録
Developer-->>User: ライセンスキー送信
User->>ChromeExt: インストール
User->>ChromeExt: ライセンスキー入力
User->>ChromeExt: Googleアカウントでサインイン
ChromeExt->>CloudFunction: ユーザー情報とライセンスキー送信
CloudFunction->>Firestore: ライセンス検証
alt ライセンスが有効
Firestore-->>CloudFunction: 検証OK
CloudFunction->>Firestore: ユーザーIDとライセンスキーを関連付け
CloudFunction-->>ChromeExt: アクティベーション成功
ChromeExt-->>User: アクティベーション完了通知
else ライセンスが無効
Firestore-->>CloudFunction: 検証NG
CloudFunction-->>ChromeExt: アクティベーション失敗
ChromeExt-->>User: エラーメッセージ表示
end
GPT-4o.icon全体のフロー
デベロッパー側の対応:
BOOTHで購入があった際に、デベロッパーは注文番号からUUIDベースのライセンスキーを手動で生成します。
Firestoreに次のようなcollectionを作成する
code:yml
licenses (コレクション)
└── {licenseKey} (ドキュメントID、例: "c2b1e4b0-8f29-11e9-b475-0800200c9a66")
├── userId: "firebase-user-id-12345"
├── orderNumber: "123456789"
├── issuedAt: (発行日時のタイムスタンプ)
├── isActive: true
├── linkedAt: (ユーザーに関連付けられた日時のタイムスタンプ)
└── userId: null // 初期状態ではnull、ユーザーが登録後に更新される
購入者にメール等でライセンスキーを送信します。
この時点ではユーザーのGoogle認証情報は不明です。
ユーザー側の対応:
Chrome拡張をインストール後、ユーザーは設定画面でライセンスキーを入力し、Googleアカウントでサインインします
Chrome拡張での処理:
Chrome拡張はユーザーのGoogle認証情報(user.uid)と入力されたライセンスキーをFirebaseのCloud Functionに送信します。
code:yml
licenses (コレクション)
└── {licenseKey} (ドキュメントID、例: "c2b1e4b0-8f29-11e9-b475-0800200c9a66")
├── linkedAt: (ユーザーに関連付けられた日時のタイムスタンプ)
└── userId: 12345
ライセンスの検証と登録:
未使用かどうかはif(userId==null)で判定する基素.icon
出鱈目なライセンスを打っても、デベロッパーがlicensensに登録していないので有効にならない
ライセンスが有効であれば、user.uidとライセンスキーを関連付け、Firestoreにユーザー情報を登録します。
ライセンスの無効化基素.icon
isActiveをfalseにする
注意点基素.icon
licensesの発行方法は予測されてはいけない
検討 v1
ユーザーの認証と課金情報を実装する必要がある
やっている人を見かけたが、普通に守ってなかった。厳密に突っ込まれれば違法になるだろう
ソフトウェアを「匿名」(消費者はlegal actionをとることができ、とる際には顕明になるレベルでの匿名)で販売する方法があまりない
文章やイラストやデータの販売はBoothやnoteの企業努力によってこのレベルまでは実現できている
というわけで、boothでのライセンス販売をする
どうやってるんだろう?
Boothの購入処理を確認する関係上、引き換えコードの発行は最大で12時間かかることがあります。
手動で運用している可能性がある基素.icon
boothの購入履歴からメールアドレスを取得して一括で送るプログラムを使っているとかかなぁ
実装を検討した。いけそう。